# coding:utf-8
import json
import time


def schedule_row_cache(conn, row_id, delay):
    # 先设置数据行的延迟值
    conn.zadd('delay:', row_id, delay)
    # 立即对需要缓存的数据行进行调度
    conn.zadd('schedule:', row_id, time.time())

QUIT = False
LIMIT = 10000000


class Inventory(object):
    pass


def cache_rows(conn):
    while not QUIT:
        # 尝试获取下一个需要被缓存的数据行以及该行的调度时间戳，
        # 命令会返回一个包含零个或一个元组（tuple）的列表
        next = conn.zrange('schedule:', 0, 0, withscores=True)
        now = time.time()
        if not next or next[0][1] > now:
            # 暂时没有行需要被缓存，休眠 50 毫秒后重试。
            time.sleep(.05)
            continue

        row_id = next[0][0]

        # 提前获取下一次调度的延迟时间。
        delay = conn.zscore('delay:', row_id)
        if delay <= 0:
            # 不必再缓存这个行，将它从缓存中移除。
            conn.zrem('delay:', row_id)
            conn.zrem('schedule:', row_id)
            conn.delete('inv:' + row_id)
            continue

        # 读取数据行
        row = Inventory.get(row_id)
        # 更新调度时间并设置缓存值。
        conn.zadd('schedule:', row_id, now + delay)
        conn.set('inv:' + row_id, json.dumps(row.to_dict()))




